<?php
    if (!defined('ZT')) exit;
    
    class Distribucion_DB {
        static function obten_profesor($id)
        {
            return DB::raw_query("SELECT id, economico, paterno, materno, nombre, inicio, fin , email, telefono, observaciones FROM profesores WHERE id = $id")->fetch_required_assoc( );
        }
        
        static function obten_uea($id)
        {
            return DB::raw_query("SELECT id, clave, nombre, horas FROM ueas WHERE id = $id")->fetch_required_assoc( );
        }
       //Betto01 
        static function obten_grupo($id)
        {
            $res = DB::raw_query("SELECT id, grupo, uea, profesor, trimestre, cupo, bajas, camb, cab, cas, cana FROM grupos WHERE id = $id")->fetch_required_assoc( );
            $res['horarios'] = DB::raw_query("SELECT inicio, fin, dia, salon FROM horarios WHERE grupo = $id ORDER BY dia, inicio")->fetch_all_assoc( );
            
            return $res;
        }
        static function obten_recuperacion($id)
        {
            $res = DB::raw_query("SELECT id,grupo,uea,profesor,profesor2,trimestre,camb,cab,cas,cana, (camb+ cab+cas) aprobados, cana reprobados  FROM recuperacion WHERE id = $id")->fetch_required_assoc( );
            $res['horarios'] = DB::raw_query("SELECT inicio, fin, dia, salon FROM horarios WHERE grupo = $id ORDER BY dia, inicio")->fetch_all_assoc( );
            
            return $res;
        }
        
            static function obten_estadisticas_uea($uea)
        {
            $res = DB::raw_query("SELECT grupo, uea, sum(camb) camb, sum(cab) cab, sum(cas) cas, sum(cana) cana, sum(cupo), sum(camb+cab+cas) aprobados, sum(cana) reprobados from grupos where uea  = $uea")->fetch_required_assoc( );
            $res['UEA'] = DB::raw_query("SELECT id, clave, nombre, horas FROM ueas WHERE id = $uea")->fetch_required_assoc( );
            
            return $res;
        }
        
        static function obten_estadisticas_profesor($id)
        {
            $res = DB::raw_query("select uea, profesor, count(*) numero_veces from grupos where profesor = $id group by uea  ")->fetch_required_assoc( );
            
            
            return $res;
        }
        static function obten_estadisticas_profesorArray($id)
        {
            return array(
                DB::query("select uea, profesor, count(*) numero_veces from grupos where profesor = $id group by uea  ")->fetch_all_assoc( ),
                DB::found_rows( ) 
                    );
        }
            //Betto01
        static function lista_profesores($cuantos, $pagina)
        {
            return array(
                DB::query("SELECT SQL_CALC_FOUND_ROWS id, economico, paterno, materno, nombre, inicio, fin, email, telefono FROM profesores ORDER BY paterno, materno, nombre LIMIT ?, $cuantos", $cuantos * $pagina)->fetch_all_assoc( ),
                DB::found_rows( )
            );
        }
                      
        static function lista_ueas($cuantos, $pagina)
        {
            return array(
                DB::query("SELECT SQL_CALC_FOUND_ROWS id, clave, nombre, horas FROM ueas ORDER BY clave, nombre LIMIT ?, $cuantos", $cuantos * $pagina)->fetch_all_assoc( ),
                DB::found_rows( )
            );
        }

        static function lista_grupos($cuantos, $pagina)
        {
            $res = array(
                DB::query("SELECT SQL_CALC_FOUND_ROWS id, grupo, profesor, uea FROM grupos WHERE trimestre = ? ORDER BY grupo LIMIT ?, $cuantos", Usuario::obten('trimestre'), $cuantos * $pagina)->fetch_all_assoc( ),
                DB::found_rows( )
            );
            
            foreach ($res[0] as &$grupo) {
                $grupo['horarios'] = DB::query("SELECT inicio, fin, dia, salon FROM horarios WHERE grupo = ? ORDER BY dia, inicio", $grupo['id'])->fetch_all_assoc( );
            }
            
            return $res;
        }
        
        
        /*/Betto01
        static function lista_globales($cuantos, $pagina)
        {
            $res = array(
                DB::query("SELECT SQL_CALC_FOUND_ROWS id, grupo, profesor, uea FROM grupos WHERE trimestre = ? ORDER BY grupo LIMIT ?, $cuantos", Usuario::obten('trimestre'), $cuantos * $pagina)->fetch_all_assoc( ),
                DB::found_rows( )
            );
            
            foreach ($res[0] as &$grupo) {
                $grupo['horariosglobales'] = DB::query("SELECT inicio, fin, dia, salon FROM horariosglobales WHERE grupo = ? ORDER BY dia, inicio", $grupo['id'])->fetch_all_assoc( );
            }
            
            return $res;
        }
        //Betto01*/

        static function lista_recuperacion($cuantos, $pagina)
        {
            $res = array(
                DB::query("SELECT SQL_CALC_FOUND_ROWS id, grupo, profesor, profesor2, uea FROM recuperacion WHERE trimestre = ? ORDER BY grupo LIMIT ?, $cuantos", Usuario::obten('trimestre'), $cuantos * $pagina)->fetch_all_assoc( ),
                DB::found_rows( )
            );
            
            foreach ($res[0] as &$grupo) {
                $grupo['horarios'] = DB::query("SELECT inicio, fin, dia, salon FROM horarios WHERE grupo = ? ORDER BY dia, inicio", $grupo['id'])->fetch_all_assoc( );
            }
            
            return $res;
        }

                
        static function lista_grupos_profesor($profesor)
        {
            $res = DB::query("SELECT id, grupo, profesor, uea FROM grupos WHERE profesor = $profesor AND trimestre = ? ORDER BY grupo", Usuario::obten('trimestre'))->fetch_all_assoc( );

            foreach ($res as &$grupo) {
                $grupo['horarios'] = DB::query("SELECT inicio, fin, dia, salon FROM horarios WHERE grupo = ? ORDER BY dia, inicio", $grupo['id'])->fetch_all_assoc( );
            }
            
            return $res;
        }
        
        static function lista_grupos_uea($uea)
        {
            $res = DB::query("SELECT id, grupo, profesor, uea FROM grupos WHERE uea = $uea AND trimestre = ? ORDER BY grupo", Usuario::obten('trimestre'))->fetch_all_assoc( );

            foreach ($res as &$grupo) {
                $grupo['horarios'] = DB::query("SELECT inicio, fin, dia, salon FROM horarios WHERE grupo = ? ORDER BY dia, inicio", $grupo['id'])->fetch_all_assoc( );
            }
            
            return $res;
        }

        static function lista_grupos_salon($salon)
        {
            $res = DB::query("SELECT DISTINCT id, grupos.grupo, profesor, uea FROM grupos, horarios WHERE id = horarios.grupo AND salon = ? AND trimestre = ? ORDER BY grupos.grupo", $salon, Usuario::obten('trimestre'))->fetch_all_assoc( );

            foreach ($res as &$grupo) {
                $grupo['horarios'] = DB::query("SELECT inicio, fin, dia, salon FROM horarios WHERE grupo = ? AND salon = ? ORDER BY dia, inicio", $grupo['id'], $salon)->fetch_all_assoc( );
            }
            
            return $res;
        }
        
   
        static function lista_trimestres_select( )
        {
            $trimestre = Usuario::obten('trimestre');
            $trimestres = DB::raw_query('SELECT DISTINCT trimestre FROM grupos')->fetch_all_value( );
            
            if (isset($trimestre)) {
                $trimestres[] = $trimestre;
            }

            return array_reverse(array_unique($trimestres));
        }
        
        static function lista_profesores_select( )
        {
            return DB::raw_query('SELECT id, paterno, materno, nombre FROM profesores ORDER BY paterno, materno, nombre')->fetch_all_assoc( );
        }
        
        static function lista_ueas_select( )
        {
            return DB::raw_query('SELECT id, clave, nombre FROM ueas ORDER BY clave, nombre')->fetch_all_assoc( );
        }
        
          
        static function agrega_profesor($economico, $paterno, $materno, $nombre, $horario, $email, $telefono, $observaciones)
        {
            DB::query("INSERT INTO profesores (economico, paterno, materno, nombre, inicio, fin, email, telefono, observaciones) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", $economico, $paterno, $materno, $nombre, $horario[0], $horario[1], $email, $telefono, $observaciones);
            return DB::insert_id( );
        }
        
        static function agrega_uea($clave, $nombre, $horas)
        {
            DB::query("INSERT INTO ueas (clave, nombre, horas) VALUES ($clave, ?, ?)", $nombre, $horas);
            return DB::insert_id( );
        }
        
        static function agrega_grupo($grupo, $uea, $profesor, $trimestre, $horarios, $cupo, $bajas, $camb, $cab, $cas, $cana)
        {
            DB::query("INSERT INTO grupos (grupo, uea, profesor, trimestre, cupo, bajas, camb, cab, cas, cana) VALUES (?, $uea, ?, $trimestre,?,?,?,?,?,?)", $grupo, $profesor);
            
            foreach ($horarios as $horario) {
                DB::query("INSERT INTO horarios (grupo, inicio, fin, dia, salon) VALUES (LAST_INSERT_ID( ), ?, ?, ?, ?)", $horario['horario'][0], $horario['horario'][1], $horario['dia'], $horario['salon']);
            }
            
            return DB::insert_id( );
        }
        
        
        static function modifica_profesor($id, $economico, $paterno, $materno, $nombre, $horario, $email, $telefono, $observaciones)
        {
            DB::query("UPDATE profesores SET economico = ?, paterno = ?, materno = ?, nombre = ?, inicio = ?, fin = ?, email = ?, telefono = ?, observaciones = ? WHERE id = $id", $economico, $paterno, $materno, $nombre, $horario[0], $horario[1], $email, $telefono, $observaciones);
        }

        static function modifica_uea($id, $clave, $nombre, $horas)
        {
            DB::query("UPDATE ueas SET clave = $clave, nombre = ?, horas = ? WHERE id = $id", $nombre, $horas);
        }

        //Betto01
        static function modifica_grupo($id, $grupo, $uea, $profesor, $trimestre, $horarios,$cupo,$bajas,$camb,$cab,$cas,$cana)
        {
            DB::query("UPDATE grupos SET grupo = ?, uea = $uea, profesor = ?, trimestre = $trimestre,cupo = $cupo, bajas = $bajas, camb = $camb, cab = $cab, cas = $cas, cana = $cana WHERE id = $id", $grupo, $profesor);
            DB::raw_query("DELETE FROM horarios WHERE grupo = $id");
            
            foreach ($horarios as $horario) {
                DB::query("INSERT INTO horarios (grupo, inicio, fin, dia, salon) VALUES ($id, ?, ?, ?, ?)", $horario['horario'][0], $horario['horario'][1], $horario['dia'], $horario['salon']);
            }
        }
        
         static function modifica_recu($id, $grupo, $uea, $profesor,$trimestre, $horarios,$cupo,$bajas,$camb,$cab,$cas,$cana)
        {
            DB::query("UPDATE recuperacion SET grupo = ?, uea = $uea, profesor = ?, trimestre = $trimestre,cupo = $cupo, bajas = $bajas, camb = $camb, cab = $cab, cas = $cas, cana = $cana WHERE id = $id", $grupo, $profesor);
            DB::raw_query("DELETE FROM horarios WHERE grupo = $id");
            
            foreach ($horarios as $horario) {
                DB::query("INSERT INTO horarios (grupo, inicio, fin, dia, salon) VALUES ($id, ?, ?, ?, ?)", $horario['horario'][0], $horario['horario'][1], $horario['dia'], $horario['salon']);
            }
        }
        
        
        
        //Betto01
        
        
        static function elimina_profesor($id)
        {
            DB::raw_query("DELETE FROM profesores WHERE id = $id");
        }

        static function elimina_uea($id)
        {
            DB::raw_query("DELETE FROM ueas WHERE id = $id");
        }

        static function elimina_grupo($id)
        {   
            DB::raw_query("DELETE FROM grupos WHERE id = $id");
        }
        
        
        static function sugiere_profesores($paterno, $materno, $nombre)
        {
            return DB::query("SELECT id, paterno, materno, nombre FROM profesores WHERE paterno SOUNDS LIKE ? AND materno SOUNDS LIKE ? AND nombre SOUNDS LIKE ? LIMIT 1", $paterno, $materno, $nombre)->fetch_assoc( );
        }
        
        static function encuentra_inconsistencias( )
        {
            $trimestre = Usuario::obten('trimestre');
            $horarios = DB::query('SELECT id, grupos.grupo, profesor, dia, salon, inicio, fin FROM grupos, horarios WHERE id = horarios.grupo AND trimestre = ?', $trimestre)->fetch_all_assoc( );
        
            $dias = array( );
            $salones = array( );
            $profesores = array( );
            
            foreach ($horarios as $horario) {
                $dias[$horario['dia']][] = $horario;
            }

            foreach ($dias as $dia => $horarios) {
                for ($i = 0, $t = count($horarios); $i < $t; ++$i) {
                    $a = $horarios[$i];

                    for ($j = $i + 1; $j < $t; ++$j) {
                        $b = $horarios[$j];
                        
                        if ($a['inicio'] >= $b['inicio'] && $a['inicio'] <= $b['fin'] || $b['inicio'] >= $a['inicio'] && $b['inicio'] <= $a['fin']) {
                            if ($a['salon'] == $b['salon']) {
                                $salones[] = array(
                                    'dia' => $dia,
                                    'salon' => $a['salon'],
                                    'grupos' => array($a, $b),
                                );
                            }

                            if ($a['profesor'] == $b['profesor'] && isset($a['profesor'])) {
                                $profesores[] = array(
                                    'dia' => $dia,
                                    'profesor' => $a['profesor'],
                                    'grupos' => array($a, $b),
                                );
                            }
                        }
                    }
                }
            }
            
            return array(
                'salones' => $salones,
                'profesores' => $profesores,
                'horarios' => DB::query('SELECT grupos.id, grupos.grupo, profesor, paterno, materno, nombre, dia, profesores.inicio AS profesor_inicio, profesores.fin AS profesor_fin, horarios.inicio AS horario_inicio, horarios.fin as horario_fin FROM grupos, horarios, profesores WHERE grupos.id = horarios.grupo AND profesor = profesores.id AND (horarios.inicio < profesores.inicio OR horarios.fin > profesores.fin) AND trimestre = ?', $trimestre)->fetch_all_assoc( ),
                'ueas' => DB::query('SELECT * FROM (SELECT grupos.id, grupos.grupo, uea, clave, nombre, horas, (SELECT SUM(TIME_TO_SEC(fin) - TIME_TO_SEC(inicio)) FROM horarios WHERE horarios.grupo = grupos.id GROUP BY horarios.grupo) / 3600 AS cuantas FROM grupos, ueas WHERE uea = ueas.id AND trimestre = ?) AS calculos WHERE horas != cuantas OR (horas > 0 AND cuantas IS NULL)', $trimestre)->fetch_all_assoc( )
            );
        }
        
        
        static function trimestre_reciente( )
        {
            return DB::raw_query('SELECT trimestre FROM grupos ORDER BY trimestre DESC LIMIT 1')->fetch_value( );
        }
        
        static function trimestre_activo($trimestre)
        {
            return DB::query('SELECT EXISTS (SELECT * FROM grupos WHERE trimestre = ?)', Usuario::obten('trimestre'))->fetch_value( );
        }
        
        
        static function lista_profesores_email( )
        {
            return DB::raw_query('SELECT id, paterno, materno, nombre, email FROM profesores ORDER BY paterno, materno, nombre')->fetch_all_assoc( );
        }

        static function crear_grupo($grupo, $uea, $profesor, $trimestre, $horarios)
        {
            DB::query("INSERT INTO grupos (grupo, uea, profesor, trimestre) VALUES (?, $uea, ?, $trimestre)", $grupo, $profesor);
        }

        static function obten_uea_by_clave($clave)
        {
            return DB::raw_query("SELECT id, clave, nombre, horas FROM ueas WHERE clave = $clave")->fetch_required_assoc( );
        }
    }
?>